home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
bmpcut_s
/
bmpcut_s.lzh
/
BMPCUT2.S
< prev
next >
Wrap
Text File
|
1997-07-12
|
29KB
|
1,266 lines
*********************************************************************************
* EVANGELION .DLL BMP CUTTER <BMPCUT2.X> *
*********************************************************************************
.include doscall.mac
.include iocscall.mac
.include myconst.h
.text
start:
move.l 8(a0),d0
and.l #$ff_ff_ff_fe,d0
move.l d0,sp *スタック セット
sub.l a1,d0 *プログラムの終わりからプロセスの終わりまで
sub.l #6000,d0 *スタック サイズ
move.l d0,buff_size *残りは、バッファにする
move.l a1,buff_addr *バッファアドレス セット
bsr cmdchk *コマンドラインの解析
bsr s_name_chk *セーブファイル名のチェック
bsr name_get *ファイル名を取得し処理する
bsr exit *終了処理
DOS _EXIT
*****************************************************************
* ファイル名を取得し、ファイルの読み込みを行う *
*****************************************************************
name_get:
clr.w file_cnt *ファイル数のカウント初期化
bsr chkname *ファイル名に対する前処理
bsr chkext *拡張子が省略されているかチェック
move.w #ARCHIVE,-(sp) *最初のファイルを検索する
pea.l arg1(pc) *
pea.l filbuf(pc) *
DOS _FILES *
lea.l 10(sp),sp *
loop:
tst.l d0 *ファイルは見つかったか?
bmi done * 見つからなければ処理完了
bsr setpath *得られたファイル名を
* フルパスに再構成する
bsr main *メイン処理
pea.l filbuf(pc) *つぎのファイルを検索する
DOS _NFILES *
addq.l #4,sp *
bra loop *繰り返す
done:
bsr file_cnt_chk *処理したファイル数のチェック
rts
*****************************************************************
* files実行に先立ってファイル名に前処理を加える *
*****************************************************************
chkname:
pea.l nambuf(pc) *ファイル名を展開する
pea.l arg1(pc) *
DOS _NAMECK *
addq.l #8,sp *
tst.l d0 *d0<0なら
bmi in_name_err * ファイル名の指定に誤りがある
beq nowild *d0=0ならワイルドカード指定なし
cmpi.w #$00ff,d0 *d0≠FFHなら
bne wild * ワイルドカード指定あり
noname: *ファイル名が指定されていない場合
lea.l arg1(pc),a0 *バッファarg1に
lea.l nambuf(pc),a1 * nameckで展開したパス名+'*.*'
bsr strcpy * を再構成する
lea.l kome0(pc),a1 *
bsr strcpy *
wild: *ワイルドカードが指定された場合
*何もしなくてよい
cknam0:
rts
nowild: *ワイルドカードが指定されていない場合
move.w #SUBDIR,-(sp) *サブディレクトリであると仮定して
pea.l arg1(pc) * 検索してみる
pea.l filbuf(pc) *
DOS _FILES *
lea.l 10(sp),sp *
tst.l d0 *見つかったか?
bmi cknam0 * 見つからなければファイルだろう
lea.l arg1(pc),a0 *バッファarg1に
lea.l komekome(pc),a1 * もとのファイル名+'\*.PAC'
bsr strcat * を再構成する
bra chkname *nameckでファイル名を展開するために
* サブルーチン先頭に戻る
*****************************************************************
* 出力パス名をチェックする *
*****************************************************************
s_name_chk:
lea.l arg2(pc),a0 *出力パス名を指定したか?
tst.b (a0)
beq s_name_chk8 *してない
pea.l nambuf(pc) *ファイル名を展開する
pea.l arg2(pc) *
DOS _NAMECK *
addq.l #8,sp *
tst.l d0 *d0<0なら
bmi out_name_err * パス名の指定に誤りがある
beq s_name_chk1 *d0=0ならワイルドカード指定なし
cmpi.w #$00ff,d0 *d0≠FFHなら
bne out_name_err * ワイルドカード指定あり
s_name_chk1:
lea.l arg2(pc),a0 *ドライブ名を指定しているか?
cmp.b #':',1(a0)
bne out_name_err *ドライブ名の指定に誤りがある
tst.b 2(a0) *ドライブ名のみか
bne s_name_chk2 *違う
addq.l #2,a0
bra s_name_chk9
s_name_chk2:
moveq.l #0,d0 *セーブ先ドライブ番号を求める
move.b (a0),d0
bsr toupper
sub.b #'A',d0
add.b #1,d0
lea.l spathbuf(pc),a1 *セーブ先ドライブ名
move.b (a0),(a1)+
move.b #':',(a1)+
move.b #'\',(a1)+
move.l a1,-(sp) *セーブ先パスをセーブ
move.w d0,-(sp)
DOS _CURDIR
addq.l #6,sp
lea.l cpathbuf(pc),a2 *カレントパスをセーブしておく
DOS _CURDRV
add.b #"A",d0
move.b d0,(a2)+
move.b #':',(a2)+
move.b #'\',(a2)+
move.l a2,-(sp)
move.w #0,-(sp)
DOS _CURDIR
addq.l #6,sp
pea.l arg2(pc) *コマンドラインで指定されたパスへ
DOS _CHDIR * 移動してみる
addq.l #4,sp
tst.l d0 *d0が0でなければ
bmi path_err * パス名の指定に誤りがある
pea.l spathbuf(pc) *セーブ先パスを戻す
DOS _CHDIR
addq.l #4,sp
pea.l cpathbuf(pc) *カレントパスに戻す
DOS _CHDIR
addq.l #4,sp
lea.l arg2(pc),a0 *
bsr set_en *パス名の最後に\マークをセット
bra s_name_chk9
s_name_chk8:
lea.l arg2(pc),a0
DOS _CURDRV *カレントドライブ名GET
add.b #"A",d0
move.b d0,(a0)+
move.b #":",(a0)+
bra s_name_chk9
s_name_chk9:
move.l a0,nameichi
rts
*****************************************************************
* パス名に¥マークを連結する *
*****************************************************************
set_en:
tst.b (a0)+ *(a0)は0か?
bne set_en *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
cmp.b #"\",-1(a0) *一番最後の文字が¥か
beq set_en_ * ¥ならばスキップ
move.b #'\',(a0)+ * ¥をセット
set_en_:
rts
*****************************************************************
* files,nfilesで見付けたファイル名をフルパスに構成し直し *
* arg1以降に格納する *
*****************************************************************
setpath:
lea.l arg1(pc),a0 *a0=コピー先
lea.l nambuf(pc),a1 *a1=nameckで展開したパス名
bsr strcpy *コピーする
lea.l filbuf(pc),a1 *a1=files,nfilesで見付けたファイル名
lea.l 30(a1),a1
bsr strcpy *連結する
rts
*****************************************************************
* 文字列の連結および複写 *
* リターン時a0は文字列末の00Hを指す *
*****************************************************************
strcat:
tst.b (a0)+ *(a0)は0か?
bne strcat *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
strcpy:
move.b (a1)+,(a0)+ *1文字ずつ
bne strcpy *終了コードまでを転送する
subq.l #1,a0 *a0は進み過ぎている
*a0は文字列末の00Hを指す
rts
*****************************************************************
* 拡張子を補う *
*****************************************************************
chkext:
lea.l arg1(pc),a0 *ファイル名のアドレス
lea.l dext(pc),a1 *拡張子のアドレス
chkext0:
cmp.b #".",(a0) *拡張子があるか
beq chkext2
tst.b (a0)+ *(a0)は0か?
bne chkext0 *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
chkext1:
move.b (a1)+,(a0)+ *1文字転送
bne chkext1 *終了コードまで繰り返す
chkext2:
rts
*****************************************************************
* コマンドラインのチェックを行う *
*****************************************************************
cmdchk:
lea.l arg1(pc),a0 *a0=引数切り出し領域
clr.b 256(a0) *出力ファイル名をちょっと初期化
addq.l #1,a2 *a2=コマンドライン文字列先頭
cmdchk0:
bsr switch_chk *スイッチのチェック
tst.b (a2) *引数があるか?
beq usage *ないならファイル名が足りない
bsr getarg *ファイル名切り出し
lea.l 256(a0),a0 *a0=a0+256
bsr switch_chk *さらにスイッチのチェック
bsr getarg *ファイル名切り出し
bsr switch_chk *さらにスイッチのチェック
tst.b (a2) *引数があるか?
bne usage * あるなら引数が多い
cmdchk1:
rts
*****************************************************************
* スペースを飛ばしつぎの引数先頭までポインタを進め *
* スイッチがあれば処理してしまう *
*****************************************************************
switch_chk:
bsr skipsp *スペースをスキップする
tst.b (a2) *まだスイッチがあるか?
beq switch_chk2 *ないなら戻る(処理の振り分けを行う)
cmpi.b #'/',(a2) *引数の先頭が
beq switch_chk1 */,-であれば
cmpi.b #'-',(a2) * スイッチ
beq switch_chk1 *
bra switch_chk2 *スイッチでないなら戻る
switch_chk1:
addq.l #1,a2 *'/'や'-'の分ポインタを進める
tst.b (a2) *スイッチがあるか?
beq usage * ないなら使用方表示
move.b (a2)+,d0 *1文字取り出す
bsr toupper *大文字に変換しておく
bra usage *無効なスイッチが指定された
switch_chk2:
rts
*****************************************************************
* ファイル名を切り出す *
*****************************************************************
getarg:
move.l a0,-(sp) *{レジスタ待避
gtarg0: tst.b (a2) *1)文字列の終端コードか
beq gtarg1 *
cmpi.b #SPACE,(a2) *2)スペースか
beq gtarg1 *
cmpi.b #TAB,(a2) *3)タブか
beq gtarg1 *
* cmpi.b #'-',(a2) *4)ハイフンか
* beq gtarg1 *
cmpi.b #'/',(a2) *5)スラッシュ
beq gtarg1 *
move.b (a2)+,(a0)+ * が現れるまで転送を
bra gtarg0 * 繰り返す
gtarg1: clr.b (a0) *文字列終端コードを書き込む
movea.l (sp)+,a0 *}レジスタ復帰
rts
*****************************************************************
* スペース・TABをスキップする *
*****************************************************************
skipsp0:
addq.l #1,a2
skipsp:
cmpi.b #$20,(a2)
beq skipsp0
cmpi.b #$09,(a2)
beq skipsp0
rts
*****************************************************************
* 小文字→大文字変換ルーチン *
*****************************************************************
toupper:
cmpi.b #'a',d0
bcs toupr0
cmpi.b #'z'+1,d0
bcc toupr0
subi.b #$20,d0
toupr0:
rts
*****************************************************************
* メイン処理 *
*****************************************************************
main:
clr.w edaban
bsr save_name_get
lea.l arg1(pc),a0 *ファイル名セット
bsr file_open *ファイルオープン
bsr file_size *ファイルサイズを調べる
move.l d6,filesize
cmp.l buff_size(pc),d6
bhi small *一括ロード分のメモリが無い
bsr yomikomi_prt
movea.l buff_addr(pc),a6
bsr file_read *ファイル読む
bsr file_close *ファイルクローズ
movea.l a6,a1
movea.l a6,a2
adda.l d6,a2
movea.l a1,a3
main0:
bsr kensaku_prt
movea.l a1,a4
main0_:
cmp.l a1,a4
bne main1
bsr ichi_prt
lea.l 1024(a4),a4
main1:
cmp.l a1,a2
bls main9
cmp.b #$28,(a1)+
bne main0_
cmp.b #$00,(a1)
bne main0_
move.b 12(a1),d0 *Plane Check
lsl.w #8,d0
move.b 11(a1),d0
cmp.w #$01,d0
bne main0_
move.b 14(a1),d3 *BitCount Check
lsl.w #8,d3
move.b 13(a1),d3
cmp.w #1,d3
beq main2
cmp.w #4,d3
beq main2
cmp.w #8,d3
beq main2
cmp.w #24,d3
bne main0_
main2:
subq.l #1,a1
bsr hakken_prt
bsr ichi_prt
move.b 7(a1),d0 *BMP X SIZE
lsl.w #8,d0
move.b 6(a1),d0
swap d0
move.b 5(a1),d0
lsl.w #8,d0
move.b 4(a1),d0
move.b 11(a1),d1 *BMP Y SIZE
lsl.w #8,d1
move.b 10(a1),d1
swap d1
move.b 9(a1),d1
lsl.w #8,d1
move.b 8(a1),d1
move.b 35(a1),d2 *Clr Used
lsl.w #8,d2
move.b 34(a1),d2
swap d2
move.b 33(a1),d2
lsl.w #8,d2
move.b 32(a1),d2
bsr line_byte_get
bsr bmp_head_set
move.l d0,bmpsize
movea.l a1,a6 *セーブアドレス
bsr bmp_save
add.l bmpsize(pc),a1
sub.l #14,a1 *補間したデータ分引く
addq.w #1,file_cnt *ファイル数のカウント+1
bra main0
main9:
bsr kensaku2_prt
bsr ichi_prt
lea.l crlf_mes(pc),a0
bsr mesput
rts
*****************************************************************
* 省メモリルーチン ちまちまロード *
*****************************************************************
small:
move.l d6,d5
bsr yomikomi_prt
small0:
bsr kensaku_prt
movea.l d5,a4
small1:
cmp.l d5,a4
bcs small2
bsr ichi_prt1
lea.l -1024(a4),a4
cmp.l #1024,d5
bhi small2
clr.l a4
small2:
subq.l #1,d5 *識別子チェック
bls small9
bsr getc
small3:
cmp.b #$28,d0
bne small1
subq.l #1,d5
bls small9
bsr getc
cmp.b #$00,d0
bne small3
cmp.l #54-2,d5
bls small9
movea.l buff_addr(pc),a6 *ヘッダの一部を読み込む
addq.l #2,a6
move.l #40-2,d6 *'2800'を除いた分
bsr file_read
subq.l #2,a6
move.w 12(a6),d0 *Plane Check
ror.w #8,d0
cmp.w #1,d0
bne small4
move.w 14(a6),d3 *BitCount Check
ror.w #8,d3
cmp.w #1,d3
beq small5
cmp.w #4,d3
beq small5
cmp.w #8,d3
beq small5
cmp.w #24,d3
beq small5
small4:
move.w #1,-(sp) *ちがったので
move.l #-40+2,-(sp) *位置を戻す
move.w d7,-(sp)
DOS _SEEK
addq.l #8,sp
bra small1
small5:
addq.l #2,d5
bsr hakken_prt
bsr ichi_prt1
move.l 32(a6),d0 *ClrUsed
bsr i_to_m
move.l d0,d2
move.l 8(a6),d0 *BMP Y SIZE
bsr i_to_m
move.l d0,d1
move.l 4(a6),d0 *BMP X SIZE
bsr i_to_m
bsr line_byte_get
bsr bmp_head_set
move.l d0,bmpsize
sub.l #14,d0 *補間したデータ分引く
sub.l d0,d5
cmp.l buff_size(pc),d0
bhi no_buff *メモリが無い
lea.l 40(a6),a6 *残りを読み込む
move.l d0,d6
sub.l #40,d6
bsr file_read
lea.l -40(a6),a6
move.b #$28,(a6)
move.b #$00,1(a6)
move.l d7,d1 *ファイルハンドルを取っておく
bsr bmp_save
move.l d1,d7
addq.w #1,file_cnt *ファイル数のカウント+1
bra small0
small9:
bsr file_close *ファイルクローズ
bsr kensaku2_prt
moveq.l #0,d5
bsr ichi_prt1
lea.l crlf_mes(pc),a0
bsr mesput
rts
i_to_m:
ror.w #8,d0
swap.w d0
ror.w #8,d0
rts
*****************************************************************
* 1ラインのバイト数を求める *
*****************************************************************
line_byte_get:
cmp.w #4,d3
bcs lb_set1
beq lb_set4
cmp.w #8,d3
beq lb_set8
bhi lb_set24
lb_set1:
addq.w #7,d0
lsr.w #3,d0
addq.w #3,d0
and.w #$fffc,d0
bra line_byte_set9
lb_set4:
addq.w #1,d0
lsr.w #1,d0
addq.w #3,d0
and.w #$fffc,d0
bra line_byte_set9
lb_set8:
addq.w #3,d0
andi.w #$fffc,d0
bra line_byte_set9
lb_set24:
move.w d0,d4
add.w d4,d4
add.w d4,d0
addq.w #3,d0
and.w #$fffc,d0
line_byte_set9:
rts
*****************************************************************
* ヘッダ情報作成 *
*****************************************************************
bmp_head_set:
lea.l bmp_head(pc),a0
mulu.w d1,d0 *line_byte * tate
add.l d2,d2 *ClrUsed * 4
add.l d2,d2
tst.l d2 *色数情報なし
beq bh_set0
add.l #54,d2
add.l d2,d0
ror.w #8,d2
swap.w d2
ror.w #8,d2
move.l d2,$a(a0)
bra bmp_head_set9
bh_set0:
cmp.w #4,d3
bcs bh_set1
beq bh_set4
cmp.w #8,d3
beq bh_set8
bhi bh_set24
bh_set1:
move.l #$3e000000,$a(a0)
add.l #62,d0
bra bmp_head_set9
bh_set4:
move.l #$76000000,$a(a0)
add.l #118,d0
bra bmp_head_set9
bh_set8:
move.l #$36040000,$a(a0)
add.l #1078,d0
bra bmp_head_set9
bh_set24:
move.l #$36000000,$a(a0)
add.l #54,d0
bmp_head_set9:
bsr i_to_m
move.l d0,2(a0)
bsr i_to_m
rts
*****************************************************************
* 検索位置を表示する *
*****************************************************************
ichi_prt:
IOCS _B_UP_S
moveq.l #10,d1
IOCS _B_RIGHT
move.l a1,d0
sub.l a3,d0
bra ichi_prt2
ichi_prt1:
IOCS _B_UP_S
moveq.l #10,d1
IOCS _B_RIGHT
move.l filesize(pc),d0
sub.l d5,d0
ichi_prt2:
lea.l dec_buf(pc),a0
bsr bin2dec
bsr zero_keshi
lea.l dec_buf(pc),a0
bsr mesput
lea.l sla_mes(pc),a0
bsr mesput
move.l filesize(pc),d0
lea.l dec_buf(pc),a0
bsr bin2dec
bsr zero_keshi
* lea.l dec_buf(pc),a0
bsr mesput
lea.l crlf_mes(pc),a0
bsr mesput
rts
*****************************************************************
* セーブするファイル名を作る *
*****************************************************************
save_name_get:
movea.l nameichi(pc),a0
lea.l filbuf(pc),a1
lea.l 30(a1),a1
bsr strcpy
movea.l nameichi(pc),a0
moveq.l #15-1,d0
sn_get0:
cmp.b #".",(a0)+
beq sn_get1
dbra.w d0,sn_get0
addq.l #1,a0
sn_get1:
addq.l #2,a0
move.l a0,edaichi
move.b #"0",-3(a0)
move.b #"0",-2(a0)
move.b #"0",-1(a0)
move.b #".",(a0)
move.b #"B",1(a0)
move.b #"M",2(a0)
move.b #"P",3(a0)
move.b #0,4(a0)
rts
*****************************************************************
* ディスクに書き込む *
*****************************************************************
bmp_save:
bsr setdec *ファイル名作成
move.l bmpsize(pc),d6 *セーブサイズ
move.l d6,d0
lea.l dec_buf(pc),a0
bsr bin2dec *ファイルサイズを10進に変換
bsr zero_keshi
bsr name_prt
bsr conv_prt *'セーブ中'を表示
lea.l arg2(pc),a0
bsr create *ファイル作成
movem.l d6/a6,-(sp)
lea.l bmp_head(pc),a6
moveq.l #14,d6
bsr write
movem.l (sp)+,d6/a6
sub.l #14,d6
bsr write *画像データの書き込み
bsr file_close *ファイルクローズ
bsr ok_prt *'OK!'を表示
rts
*****************************************************************
* ファイル名の枝番をセットする *
*****************************************************************
setdec:
add.w #1,edaban
move.w edaban(pc),d0 *枝番を転送
andi.l #$0000FFFF,d0 *上位ワードをクリア
movea.l edaichi,a0 *転送位置
setdec0:
divu.w #10,d0 *d0.lを10で割る
swap.w d0 *上位ワードと下位ワードを交換
addi.w #'0',d0 *0~9 → '0'~'9'
move.b d0,-(a0) *1桁格納
clr.w d0 *次の除算に備える
swap.w d0 *上位ワードと下位ワードを交換
bne setdec0
rts
*****************************************************************
* 2進=>10進 *
* d0 変換元の数値 a0 変換後の格納アドレス *
*****************************************************************
bin2dec:
PUSH d0-d3/a0-a1
moveq.l #10-1,d1
lea.l exp_tbl(pc),a1
bin2dec0:
clr.b d2
move.l (a1)+,d3
bin2dec1:
or d3,d3
sub.l d3,d0
bcs bin2dec2
addq.b #1,d2
bra bin2dec1
bin2dec2:
add.l d3,d0
add.b #'0',d2
move.b d2,(a0)+
dbra d1,bin2dec0
POP d0-d3/a0-a1
rts
exp_tbl:
.dc.l 1000000000
.dc.l 100000000
.dc.l 10000000
.dc.l 1000000
.dc.l 100000
.dc.l 10000
.dc.l 1000
.dc.l 100
.dc.l 10
.dc.l 1
*****************************************************************
* ファイルサイズの頭にある'0'を消す *
*****************************************************************
zero_keshi:
lea.l dec_buf(pc),a0
moveq.l #9-1,d0
zero_keshi0:
cmp.b #'0',(a0)
bne zero_keshi9
move.b #' ',(a0)+
dbra.w d0,zero_keshi0
zero_keshi9:
rts
*****************************************************************
* ファイルのOPENを行う *
*****************************************************************
file_open:
move.w #0,-(sp) *ファイルopen
move.l a0,-(sp)
DOS _OPEN
addq.l #6,sp
tst.l d0 *OK?
bmi open_err
move.l d0,d7 *ファイルハンドルセーブ
rts
*****************************************************************
* ファイルのサイズを求める(d6に返す) *
*****************************************************************
file_size:
move.w #2,-(sp)
move.l #0,-(sp)
move.w d7,-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
move.l d0,d6
move.w #0,-(sp)
move.l #0,-(sp)
move.w d7,-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
rts
*****************************************************************
* ディスクから1文字読み出しを行う *
*****************************************************************
getc:
move.w d7,-(sp)
DOS _FGETC *$FF1B
addq.l #2,sp
tst.l d0
bmi read_err
rts
*****************************************************************
* ディスクからデータの読み込みを行う *
*****************************************************************
file_read:
move.l d6,-(sp) *データサイズ
move.l a6,-(sp) *バッファアドレス
move.w d7,-(sp) *ファイルハンドル
DOS _READ
lea 10(sp),sp *スタック補正
tst.l d0 *OK?
bmi read_err
cmp.l d6,d0 *全部読めたか
bne read_err
rts
*****************************************************************
* ファイル作成 *
*****************************************************************
create:
move.w #$20,-(sp) *ファイルCREATE
move.l a0,-(sp)
DOS _CREATE
addq.l #6,sp
tst.l d0 *OK?
bmi create_err
move.l d0,d7 *ファイルハンドルセーブ
rts
*****************************************************************
* ディスクに書き込む *
*****************************************************************
write:
move.l d6,-(sp) *データサイズ
move.l a6,-(sp) *バッファアドレス
move.w d7,-(sp) *ファイルハンドル
DOS _WRITE
lea.l 10(sp),sp *スタック補正
tst.l d0 *OK?
bmi write_err
cmp.l d6,d0 *全部書き込めたか?
bne write_err
rts
*****************************************************************
* ファイルをCLOSEする *
*****************************************************************
file_close:
move.w d7,-(sp) *ファイルCLOSE
DOS _CLOSE
addq.l #2,sp
rts
*****************************************************************
* 処理したファイル数をチェックする *
*****************************************************************
file_cnt_chk:
moveq.l #0,d0
move.w file_cnt(pc),d0
beq file_cnt_chk1
lea.l dec_buf(pc),a0 *あり
bsr bin2dec
bsr zero_keshi
bsr mesput
lea.l some_files_mes(pc),a0
bsr mesput
bra file_cnt_chk9
file_cnt_chk1:
lea.l no_file_mes(pc),a0 *なし
bsr mesput
file_cnt_chk9:
rts
*****************************************************************
* '読み込み中'を表示 *
*****************************************************************
yomikomi_prt:
lea.l filbuf(pc),a0
lea.l 30(a0),a0
bsr mesput
lea.l yomikomi_mes(pc),a0
bsr mesput
rts
*****************************************************************
* '検索中'を表示 *
*****************************************************************
kensaku_prt:
lea.l kensaku_mes(pc),a0
bsr mesput
rts
*****************************************************************
* '発見!'を表示 *
*****************************************************************
hakken_prt:
IOCS _B_UP_S
lea.l hakken_mes(pc),a0
bsr mesput
rts
*****************************************************************
* '検索終了'を表示 *
*****************************************************************
kensaku2_prt:
IOCS _B_UP_S
lea.l kensaku2_mes(pc),a0
bsr mesput
rts
*****************************************************************
* 'セーブ中'を表示 *
*****************************************************************
conv_prt:
lea.l conv_mes(pc),a0
bsr mesput
rts
*****************************************************************
* 'OK!'を表示 *
*****************************************************************
ok_prt:
lea.l ok_mes(pc),a0
bsr mesput
rts
*****************************************************************
* セーブファイル名&サイズを表示する *
*****************************************************************
name_prt:
lea.l arg2(pc),a0
bsr mesput
lea.l dec_buf(pc),a0
bsr mesput
lea.l byte_mes(pc),a0
bsr mesput
rts
*****************************************************************
* 入力ファイル名エラー *
*****************************************************************
in_name_err:
lea.l in_mes(pc),a0
bsr mesput
lea.l name_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 出力パス名エラー *
*****************************************************************
out_name_err:
lea.l out_mes(pc),a0
bsr mesput
lea.l name_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 出力先パスが見付からない *
*****************************************************************
path_err:
lea.l out_mes(pc),a0
bsr mesput
lea.l name_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* メモリが足りない *
*****************************************************************
no_buff:
bsr file_close
lea.l no_buff_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイルが見付からない *
*****************************************************************
open_err:
lea.l arg1(pc),a0
bsr mesput
lea.l open_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイル作成エラー *
*****************************************************************
create_err:
lea.l arg2(pc),a0
bsr mesput
lea.l create_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイル書き込みエラー *
*****************************************************************
write_err:
lea.l arg2(pc),a0
bsr mesput
lea.l write_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 読み込みエラー *
*****************************************************************
read_err:
lea.l arg1(pc),a0
bsr mesput
lea.l read_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ディスクの空き容量が足りないエラー *
*****************************************************************
no_free_err:
lea.l no_free_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 使用方表示 *
*****************************************************************
usage:
lea.l usage_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* メッセージ表示 *
*****************************************************************
mesput:
* move.w #STDERR,-(sp) *標準エラー出力へ
move.w #STDOUT,-(sp) *標準出力へ
move.l a0,-(sp) *メッセージを
DOS _FPUTS *出力する
addq.l #6,sp *スタック補正
rts
*****************************************************************
* 終了処理 *
*****************************************************************
exit:
IOCS _OS_CURON *カーソル表示
move.w #-1,-(sp) *キーバッファクリア
DOS _KFLUSH
addq.l #2,sp
rts
*****************************************************************
* エラー処理2 *
*****************************************************************
exit2:
bsr exit
move.w #1,-(sp) *終了コード1を持って
DOS _EXIT2 * エラー終了
*****************************************************************
* データエリア *
*****************************************************************
.data
.even
usage_mes:
.dc.b 'BMP FILE CUTTER2 V0.01 by A.MUKAWA',CR,LF
.dc.b '機能:ファイル中に含まれているBMPと思うファイルを切り出します。',CR,LF
.dc.b '用法:BMPCUT2 ファイル名 [出力先パス名]',CR,LF
.dc.b CR,LF
.dc.b '切り出される画像のファイル名は、元のファイル名(最大15文字)の',CR,LF
.dc.b '後ろに3桁の数字が付き、拡張子が"BMP"のファイル名になります。',CR,LF
.dc.b 'このファイル名は8文字を超える事が多いので、注意して下さい。',CR,LF
.dc.b 0
some_files_mes:
.dc.b '個のBMPファイルを切り出せました。',CR,LF,0
no_file_mes:
.dc.b 'BMPファイルは見つかりませんでした。',CR,LF,0
in_mes:
.dc.b '入力ファイル',0
out_mes:
.dc.b '出力先パス',0
name_er_mes:
.dc.b '名の指定に間違いがあります!',CR,LF,0
open_er_mes:
.dc.b ' が見つかりません!',CR,LF,0
read_er_mes:
.dc.b ' の読み込みエラーが発生しました!',CR,LF,0
create_er_mes:
.dc.b ' が作れません!',CR,LF,0
write_er_mes:
.dc.b ' の書き込みエラーが発生しました!',CR,LF,0
no_buff_mes:
.dc.b '変換に必要なメモリがありません!',CR,LF,0
no_free_mes:
.dc.b 'セーブ先の空き容量が足りません!',CR,LF,0
yomikomi_mes:
.dc.b ' を読み込み中です。',CR,LF,CR,LF,0
hakken_mes:
.dc.b '発見!',CR,LF,0
kensaku_mes:
.dc.b '検索中',CR,LF,0
kensaku2_mes:
.dc.b '検索終了',CR,LF,0
sla_mes:
.dc.b '/',0
byte_mes:
.dc.b 'byte ',0
conv_mes:
.dc.b '《セーブ中》 ',,0
ok_mes:
.dc.b 'OK!',CR,LF,CR,LF,0
crlf_mes:
.dc.b CR,LF,0
dext:
.dc.b '.*',0 *補う拡張子
komekome:
.dc.b '\'
kome0:
.dc.b '*.*',0
.even
bmp_head:
.dc.b 'BM'
.ds.b 12
ico_head:
.dc.w $0000,$0100,$0100,$2020,$1000,$0000,$0000,$e802
.dc.w $0000,$1600,$0000
*****************************************************************
* ワークエリア *
*****************************************************************
.bss
.even
filbuf:
.ds.b 53 *ファイル情報格納バッファ
nambuf:
.ds.b 92 *ファイル名展開用バッファ
arg1:
.ds.b 256 *入力ファイル名バッファ
arg2:
.ds.b 256 *出力ファイル名バッファ
cpathbuf
.ds.b 65 *カレントパス名バッファ
spathbuf
.ds.b 65 *セーブ先パス名バッファ
.even
file_cnt:
.ds.w 1 *ファイル数のカウント用バッファ
buff_addr:
.ds.l 1 *画像読み込みバッファアドレス
buff_size:
.ds.l 1 *画像読み込みバッファサイズ
filesize:
.ds.l 1
bmpsize:
.ds.l 1
edaban:
.ds.w 1
nameichi:
.ds.l 1
edaichi:
.ds.l 1
dec_buf:
.ds.b 10*2
.even
.end start